#include "m_gpio.h"
#include "m_log.h"

#include "hi_gpio.h"

int m_gpio_init()
{
    return hi_gpio_init();
}
int m_gpio_set_dir(unsigned int id, m_gpio_dir dir)
{
    int r = hi_gpio_set_dir((hi_gpio_idx)id, (hi_gpio_dir)dir);
    if (r != 0) {
        m_log_e(M_GPIO_H, "hi set gpio dir fail: idx=%d, err=0x%02x", id, r);
        return r;
    }
    return 0;
}
m_gpio_dir m_gpio_get_dir(unsigned int id)
{
    hi_gpio_dir dir;
    int r = hi_gpio_get_dir((hi_gpio_idx)id, &dir);
    if (r != 0) {
        m_log_e(M_GPIO_H, "hi get gpio dir fail: idx=%d, err=0x%02x", id, r);
        return r;
    }
    return dir;
}
int m_gpio_set_val(unsigned int id, m_gpio_value val)
{
    hi_gpio_dir dir;
    int r = hi_gpio_get_dir((hi_gpio_idx)id, &dir);
    if (r != 0) {
        m_log_e(M_GPIO_H, "hi get gpio dir fail: idx=%d, err=0x%02x", id, r);
        return r;
    }
    if (dir != M_GPIO_OUT) {
        m_log_e(M_GPIO_H, "hi set gpio ouput val fail, idx is not output dir: idx=%d", id);
        return -1;
    }
    r = hi_gpio_set_ouput_val((hi_gpio_idx)id, (hi_gpio_value)val);
    if (r != 0) {
        m_log_e(M_GPIO_H, "hi set gpio ouput fail: idx=%d, err=0x%02x", id, r);
        return r;
    }
    return 0;
}
m_gpio_value m_gpio_get_val(unsigned int id)
{
    hi_gpio_dir dir;
    int r = hi_gpio_get_dir((hi_gpio_idx)id, &dir);
    if (r != 0) {
        m_log_e(M_GPIO_H, "hi get gpio dir fail: idx=%d, err=0x%02x", id, r);
        return r;
    }
    hi_gpio_value val;
    if (dir == M_GPIO_OUT) {
        r = hi_gpio_get_output_val((hi_gpio_idx)id, &val);
        if (r != 0) {
            m_log_e(M_GPIO_H, "hi get gpio output val fail: idx=%d, err=0x%02x", id, r);
            return r;
        }
    } else {
        r = hi_gpio_get_input_val((hi_gpio_idx)id, &val);
        if (r != 0) {
            m_log_e(M_GPIO_H, "hi get gpio input val fail: idx=%d, err=0x%02x", id, r);
            return r;
        }
    }
    return val;
}